package collection.stream;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;
/**
 * 演示常见的终端环节:
 * 终端环节是流式操作的最后一步，用于获取结果
 */
public class StreamApiDemo2 {
    public static void main(String[] args) {
        Random r = new Random();
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10; i++){
            list.add(r.nextInt(100));
        }
        System.out.println(list);       //输出集合
        /*
          常见的终端环节:
          1.min: 用于获取流中的最小值
          2.max: 用于获取流中的最大值
          3.anyMatch: 判断就流中是否有元素匹配lambda表达式的要求
          4.allMatch: 判断就流中是否所有元素匹配lambda表达式的要求
          5.noneMatch: 判断就流中是否没有元素匹配lambda表达式的要求
          6.reduce: 积累操作

          Optional有点类似于包装类，内部保存了一个值
          通过get()方法可以获取Optional中的值
         */
        Optional<Integer> min = list.stream().min((x1,x2)->x1-x2);
        System.out.println(min.get());  //输出最小值
        Optional<Integer> max = list.stream().max((x1,x2)->x1-x2);
        System.out.println(max.get());  //输出最大值
        boolean anyMatch = list.stream().anyMatch(x->x%2==0);
        System.out.println(anyMatch);   //有一个偶数就为true
        boolean allMatch = list.stream().allMatch(x->x%2==0);
        System.out.println(allMatch);   //全部都为偶数才为true
        boolean noneMatch = list.stream().noneMatch(x->x%2==0);
        System.out.println(noneMatch);  //全部都不为偶数才为true
        int number = list.stream().reduce((x1,x2)->x1+x2).get();
        System.out.println(number);     //求和
    }
}
